package udf.string;

import java.io.IOException;
import java.util.ArrayList;

import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;


public class OrderFreq extends EvalFunc<Tuple> {

	public Tuple exec(Tuple input) throws IOException {


			Tuple output = TupleFactory.getInstance().newTuple();
			
			ArrayList<Integer> freq = new ArrayList<Integer>();
			
			Tuple f = (Tuple) input.get(0);
			
			Integer pos_target = (Integer) input.get(1); // pos found
			Integer pos_found = (Integer) input.get(2); // pos found
				
			for(int i=0; i<f.size(); i++){
				
				freq.add((Integer) f.get(i));
			}
			
			ArrayList<Integer> n = null;
			
			
			if(freq.size()==2){
				n= sortBiFreq(freq,pos_found, pos_target);
			}
			
			if(freq.size()==3){
				n= sortTriFreq(freq,pos_found, pos_target);
		
			}
			
			for(int i=0; i<n.size(); i++){
				
				output.append(n.get(i));
				System.out.println(f.get(i) + "\t" + n.get(i));
			}
			
			// System.out.println("Processing:" + domain + "\t" + level);
			
			return output;

			

	}
	
	
	public ArrayList<Integer> sortTriFreq(ArrayList<Integer> freq,
			int pos_found, int pos_target) {

		ArrayList<Integer> n = new ArrayList<Integer>();

		if (pos_target == 0) {

			if (pos_found == 0) {
				n.add(freq.get(0));
				n.add(freq.get(1));
				n.add(freq.get(2));

			}

			if (pos_found == 1) {

				n.add(freq.get(0));
				n.add(freq.get(2));
				n.add(freq.get(1));

			}

			if (pos_found == 2) {
				n.add(freq.get(1));
				n.add(freq.get(0));
				n.add(freq.get(2));

			}

		} else if (pos_target == 1) {

			if (pos_found == 0) {
				n.add(freq.get(0));
				n.add(freq.get(2));
				n.add(freq.get(1));

			}

			if (pos_found == 1) {
				n.add(freq.get(0));
				n.add(freq.get(1));
				n.add(freq.get(2));
			}

			if (pos_found == 2) {
				n.add(freq.get(2));
				n.add(freq.get(1));
				n.add(freq.get(0));

			}

		} else if (pos_target == 2) {

			if (pos_found == 0) {
				n.add(freq.get(1));
				n.add(freq.get(0));
				n.add(freq.get(2));

			}

			if (pos_found == 1) {

				n.add(freq.get(2));
				n.add(freq.get(1));
				n.add(freq.get(0));

			}

			if (pos_found == 2) {
				n.add(freq.get(0));
				n.add(freq.get(1));
				n.add(freq.get(2));

			}

		}

		return n;

	}

	public ArrayList<Integer> sortBiFreq(ArrayList<Integer> freq,
			int pos_found, int pos_target) {

		ArrayList<Integer> n = new ArrayList<Integer>();

		if (pos_target == 0) {

			if (pos_found == 0) {
				n.add(freq.get(0));
				n.add(freq.get(1));

			}

			if (pos_found == 1) {

				n.add(freq.get(1));
				n.add(freq.get(0));

			}

		} else if (pos_target == 1) {

			if (pos_found == 0) {
				n.add(freq.get(1));
				n.add(freq.get(0));
			

			}

			if (pos_found == 1) {
				n.add(freq.get(0));
				n.add(freq.get(1));
			}

		}

		return n;

	}
	
	
	
}
